import struct
from machine import Timer, DAC, Pin

class WAVPlayer:
    def __init__(self, stream, wav_file):
        self.stream = stream
        self.wav = open(wav_file, "rb")
        self.read_wav_header()
        self.stream.register_callback(self.play_loop)
        self.wav_pos = self.wav.seek(44)  # Seek to PCM data begin
        self.t1 = Timer(0)

        # Инициализация DAC
        self.dac = DAC(Pin(26))

    def read_wav_header(self):
        self.wav.seek(20)
        self.wav_format, \
        self.wav_channels, \
        self.wav_sample_rate, \
        self.wav_byterate, \
        self.wav_blockalign, \
        self.wav_bits_per_sample, \
        self.wav_datasignature, \
        self.wav_data_size = struct.unpack('HHIIHH4sI', self.wav.read(24))

        self.wav_size = self.wav_data_size + 44

        print(f"WAV File: {self.wav.name}\n"
              f"WAV Format: {self.wav_format}\n"
              f"WAV Channels: {self.wav_channels}\n"
              f"WAV Sample rate: {self.wav_sample_rate}\n"
              f"WAV Bits per sample: {self.wav_bits_per_sample}")

    def play_loop(self, data):
        if self.wav_pos == self.wav_size:
            self.t1.deinit()
            self.wav_pos = self.wav.seek(44)
            print("Stop play")
            return

        self.dac.write(data)  # Вывод данных на DAC
        self.stream.send(data)
        self.wav_pos += 1

    def play(self):
        self.t1.init(freq=self.wav_sample_rate, mode=Timer.PERIODIC, callback=self.play_loop)


'''
WAVPlayer - это класс, предназначенный для воспроизведения WAV-файлов. Он использует класс Stream для передачи потоковых данных из WAV-файла.
Пример использования:

# Создаем объект Stream
stream = Stream()

# Создаем объект WAVPlayer и воспроизводим WAV-файл
wav_player = WAVPlayer(stream, "assets/wav/example.wav")
wav_player.play()

# Обработка потоковых данных
for data in stream:
    # Здесь можно обрабатывать данные из потока
    print(data)

'''
